package com.study.s01.simplefactory;

public class FruitFactory {
	
	//获得apple实例
//	public Apple getApple() {
	public static Apple getApple() {
		return new Apple();
	}
	//获得banana实例
//	public Banana getBanana() {
	public static Banana getBanana() {
		return new Banana();
	}
	
	//一次性获取所有产品
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {
		if(type.equalsIgnoreCase("banana")) {
			return Banana.class.newInstance();
		} else if(type.equalsIgnoreCase("apple")) {
			return Apple.class.newInstance();
		} else {
			return null;
		}
	}
	
	//一次性获取所有产品
	public static Fruit getFruit2(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		/**
		 * 视频教程中代码为
		 * Class fruit = Class.forName(type);
		 * return (Fruit) fruit.newInstance();
		 * 此处存在一个问题，Class.forName(type)中的type应为类名字符串，其组成是包名+类名
		 * 视频教程中并没有打包，所以直接写的类名
		 * Class对象生成方式有三种
		 * 1、类名.class 
		 * 说明： JVM将使用类装载器, 将类装入内存(前提是:类还没有装入内存),不做类的初始化工作.返回Class的对象
		 * 2、Class.forName("类名字符串")  （注：类名字符串是包名+类名）
		 * 说明：装入类,并做类的静态初始化，返回Class的对象
		 * 3、实例对象.getClass()
		 * 说明：对类进行静态初始化、非静态初始化；返回引用o运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象
		 *
		 */
		String className = "com.study.one.simplefactory."+type;
		Class<?> fruit = Class.forName(className);
		return (Fruit) fruit.newInstance();
	}
}
